<?php

/**
 * Simple Site
 *
 * LICENÇA
 *
 * Este arquivo é parte do programa Simple Site
 *
 * Simple Site é um software livre; você pode redistribui-lo e/ou modifica-lo
 * dentro dos termos da Licença Pública Geral GNU como publicada pela
 * Fundação do Software Livre (FSF); na versão 2 da Licença, ou (na sua opnião)
 * qualquer versão.
 *
 * Este programa é distribuido na esperança que possa ser  util, mas
 * SEM NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer
 * MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU para
 * maiores detalhes.
 *
 * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
 * programa, se não, escreva para a Fundação do Software Livre(FSF) Inc.,
 * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * @category   Simple_Site
 * @package    Include
 * @license    http://www.gnu.org/licenses/gpl-2.0.html  GNU General Public License Version 2 (GPL 2)
 * @author     Alex Rodin <contato@alexrodin.com>
 */
/**
 * Impedindo acessos diretos a esse arquivo
 */
defined('SIMPLE_SITE') || header('Location: http://alexrodin.com/');

require_once 'Config.php';

/**
 * Classe usada para o envio de email pelo formulário de contato do site
 *
 * @category   Simple_Site
 * @package    Include
 * @license    http://www.gnu.org/licenses/gpl-2.0.html  GNU General Public License Version 2 (GPL 2)
 * @author     Alex Rodin <contato@alexrodin.com>
 */
class Email
{

    /**
     * Flag que marca se houve erros no envio do e-mail
     * 
     * @var boolean
     */
    protected $_errors = false;
    /**
     * A mensagem do email
     * 
     * @var string
     */
    protected $_message;
    /**
     * O assunto do email
     * 
     * @var string
     */
    protected $_subject;
    /**
     * O email do remetente
     * 
     * @var string
     */
    protected $_responseEmail;
    /**
     * O nome do remetente
     *
     * @var string
     */
    protected $_responseName;

    /**
     * O construtor padrao
     * 
     * @param array $data Informações sobre o remetente e a mensagem 
     */
    public function __construct(array $data = null)
    {
        if ($data == null)
            return;

        $this->_responseEmail = $data['response_email'];
        $this->_responseName = $data['response_name'];
        $this->_subject = $data['subject'];
        $this->_message = $data['message'];
    }

    /**
     * Usado para verificar se houve erros no envio do email
     * 
     * @return boolean
     */
    public function hasErrors()
    {
        return $this->_errors;
    }

    /**
     * Retorna os headers para o envio do email
     * 
     * @param string $name Nome do remetente
     * @param string $email Email do remetente
     * @return string 
     */
    protected function _getHeaders($name, $email)
    {
        $headers = 'MIME-Version: 1.0' . "\r\n";
        $headers.= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

        // Alguns cabeçalhos adicionais
        $headers.= 'From: ' . $name . ' <' . $email . '>' . "\r\n";

        return $headers;
    }

    /**
     * Renderiza e retorna o corpo do email, usa para isso os templates que se
     * encotram na pasta Email/tpl
     *
     * @param boolean $isResponse 
     * @return string
     */
    protected function _getBody($isResponse = false)
    {
        $message = $this->_message;
        $subject = $this->_subject;
        $name = $this->_responseName;

        ob_start();
        if ($isResponse) {
            include 'Email/tpl/response.phtml';
        } else {
            include 'Email/tpl/tome.phtml';
        }
        $output = ob_get_clean();
        return $output;
    }

    /**
     * Envia o email
     * @param boolean $isResponse
     * @return boolean
     */
    protected function _sendEmail($isResponse = false)
    {
        $name = '';
        $email = '';
        $emailToSend = '';

        $contactInfo = Config::getContactInfo();
        // Email que virá para mim deve vir com o email de quem mandou e
        // O nome dele
        if (!$isResponse) {
            $name = $this->_responseName;
            $email = $this->_responseEmail;
            $emailToSend = $contactInfo['email'];
        } else {

            $name = $contactInfo['response_name'];
            $email = $contactInfo['email'];
            $emailToSend = $this->_responseEmail;
        }
        // TODO: THROW

        $body = $this->_getBody($isResponse);
        $headers = $this->_getHeaders($name, $email);


        if (!mail($emailToSend, $this->_subject, $body, $headers)) {
            // Marca a flag de erro se nao conseguir enviar o e-mail
            $this->_errors = true;
            return false;
        }

        return true;
    }

    /**
     * Envia dois emails , um para mim e outro para quem redigiu a mensagem
     */
    function send()
    {
        if ($this->_sendEmail(false)) {
            $this->_sendEmail(true);
        }
    }

}